package com.ck.company.service;

import com.ck.exception.ServiceException;
import com.ck.model.common.DeviceGroup;
import com.ck.model.common.User;
import com.ck.model.company.dto.CpDeviceGroupListDTO;
import com.ck.model.company.dto.CpDeviceGroupTreeListDTO;
import com.ck.model.company.dto.CpDeviceGroupTreeListForProgramDTO;

import java.text.ParseException;
import java.util.List;

public interface CpDeviceGroupService {
    /**
     * 所有终端分组列表
     *
     * @param companyCode 商家代码
     * @return List<DeviceGroupListDTO>
     */
    List<CpDeviceGroupListDTO> listAllDeviceGroup(String companyCode);

    /**
     * 保存终端分组
     *
     * @param deviceGroup TbDeviceGroup类型对象
     * @param user        登录用户
     * @param ip          用户IP
     * @throws ServiceException
     */
    void saveDeviceGroup(DeviceGroup deviceGroup, User user, String ip) throws ServiceException;

    /**
     * 更新终端分组
     *
     * @param deviceGroup TbDeviceGroup类型对象
     * @param user        登录用户
     * @param ip          用户IP
     * @throws ServiceException
     */
    void updateDeviceGroup(DeviceGroup deviceGroup, User user, String ip) throws ServiceException;

    /**
     * 获取终端分组
     *
     * @param companyCode   商家代码
     * @param deviceGroupId 终端分组ID
     */
    DeviceGroup getDeviceGroup(String companyCode, Long deviceGroupId);

    /**
     * 删除终端分组
     *
     * @param deviceGroupId 终端分组ID
     * @param groupName     分组名称
     * @param groupId       分组ID
     * @param user          登录用户
     * @param ip            用户IP
     */
    void deleteDeviceGroup(Long deviceGroupId, String groupName, Long groupId, User user, String ip);

    /**
     * 通过父ID获取终端分组列表
     *
     * @param companyCode 商家代码
     * @param parentId    父ID
     * @return List<TbDeviceGroup>
     */
    List<DeviceGroup> listDeviceGroupByParentId(String companyCode, Long parentId);

    /**
     * 所有终端树形分组列表
     *
     * @param companyCode 商家代码
     * @return List<DeviceGroupTreeListDTO>
     */
    List<CpDeviceGroupTreeListDTO> listAllDeviceGroupTree(String companyCode);

    /**
     * 移动终端到分组
     *
     * @param deviceGroupId 分组ID
     * @param deviceCodes   终端code，多个用逗号分隔
     * @param user          登录用户
     * @param ip            用户IP
     * @throws ServiceException
     */
    void moveDeviceGroup(Long deviceGroupId, String deviceCodes, User user, String ip) throws ServiceException;

    /**
     * 所有终端树形分组列表
     *
     * @param companyCode 商家编号
     * @return List<CpDeviceGroupTreeListForProgramDTO>
     */
    List<CpDeviceGroupTreeListForProgramDTO> listAllDeviceGroupTreeForProgram(String companyCode);

    /**
     * 查询树形分组列表
     *
     * @param companyCode 商家编码
     * @param startTimeL  投放开始时间
     * @param endTimeL    投放结束时间
     * @return List<CpDeviceGroupTreeListDTO>
     */
    List<CpDeviceGroupTreeListDTO> deviceGroupTreeListByTime(String companyCode, Long startTimeL, Long endTimeL);

    /**
     * 查询投放终端组时的终端组树
     *
     * @param user      登录的用户
     * @param startTime 节目投放开始时间
     * @param endTime   节目投放结束时间
     * @return List<CpDeviceGroupTreeListDTO>
     * @throws ParseException
     */
    List<CpDeviceGroupTreeListDTO> treeToGroup(User user, String startTime, String endTime) throws ParseException;

    /**
     * 查询投放终端时的终端组树
     *
     * @param user          登录的用户
     * @param deviceGroupId 分组ID
     * @return List<CpDeviceGroupTreeListForProgramDTO>
     */
    List<CpDeviceGroupTreeListForProgramDTO> treeToDevice(User user, String deviceGroupId);
}
